﻿#include<iostream>
using namespace std;

//class Exception
//{
//public:
//    Exception(const string& errmsg, int id)
//        :_errmsg(errmsg)
//        , _id(id)
//    {}
//    virtual string what() const
//    {
//        return _errmsg;
//    }
//    int getid() const
//    {
//        return _id;
//    }
//protected:
//    string _errmsg;
//    int _id;
//};
//
//class HttpException : public Exception
//{
//public:
//    HttpException(const string& errmsg, int id, const string& type)
//        :Exception(errmsg, id)
//        , _type(type)
//    {}
//    virtual string what() const
//    {
//        string str = "HttpException:";
//        str += _type;
//        str += ":";
//        str += _errmsg;
//        return str;
//    }
//private:
//    const string _type;
//};
//
//void _SeedMsg(const string& s)
//{
//    if (rand() % 2 == 0)
//    {
//        throw HttpException("网络不稳定，发送失败", 102, "put");
//    }
//    else if (rand() % 7 == 0)
//    {
//        throw HttpException("你已经不是对象的好友，发送失败 ", 103, "put");
//    }
//    else
//    {
//        cout << "发送成功" << endl;
//    }
//}
//
//void SendMsg(const string& s)
//{
//    // 发送消息失败，则再重试3次
//    for (size_t i = 0; i < 4; i++)
//    {
//        try
//        {
//            _SeedMsg(s);
//            break;
//        }
//        catch (const Exception& e)
//        {
//            // 捕获异常，if是102号错误，⽹络不稳定，则重新发送
//
//            // 捕获异常，else中不是102号错误，则将异常重新抛出
//
//            if (e.getid() == 102)
//            {
//                // 重试三次以后否失败了，则说明⽹络太差了，重新抛出异常
//                if (i == 3)
//                    throw;
//
//                cout << "开始第" << i + 1 << "重试" << endl;
//            }
//            else
//            {
//                throw;
//            }
//        }
//    }
//}
//
//
//class A
//{
//public:
//    A() {}
//    A(int) = delete;
//};
#include<functional>
//int main()
//{
//    /*srand(time(0));
//    string str;
//    while (cin >> str)
//    {
//        try
//        {
//            SendMsg(str);
//        }
//        catch (const Exception& e)
//        {
//            cout << e.what() << endl << endl;
//        }
//        catch (...)
//        {
//            cout << "Unkown Exception" << endl;
//        }
//    }*/
//
//    auto b = [](int x, int y)->int {return x + y ;};
//    auto a = [](int x, int y) {return x + y; };
//
//    function<int(int, int)> f = [](int x, int y)->int {return x + y; };
//    cout << f(1, 2);
//
//	return 0;
//}

#include <iostream>
#include <string>

// 假设这是自定义的异常类
class Exception
{
public:
    int getid() const
    {
        return id;
    }
    Exception(int id) : id(id)
    {
        std::cout << "Exception constructor called with id: " << id << std::endl;
    }
    Exception(const Exception& e) : id(e.id)
    {
        std::cout << "Exception copy constructor called with id: " << id << std::endl;
    }
    ~Exception()
    {
        std::cout << "Exception destructor called with id: " << id << std::endl;
    }
private:
    int id;
};

// 假设这是发送消息的函数
void _SeedMsg(const std::string& s)
{
    // 这里简单模拟可能抛出异常的情况
    throw Exception(102);
}

void SendMsg(const std::string& s)
{
    // 发送消息失败，则再重试3次
    for (size_t i = 0; i < 4; i++)
    {
        try
        {
            _SeedMsg(s);
            break;
        }
        catch (const Exception& e)
        {
            // 捕获异常，if是102号错误，网络不稳定，则重新发送
            // 捕获异常，else中不是102号错误，则将异常重新抛出
            if (e.getid() == 102)
            {
                // 重试三次以后否失败了，则说明网络太差了，重新抛出异常
                if (i == 0)
                {
                    //throw;
                    throw e;
                }
                std::cout << "开始第 " << i + 1 << " 重试" << std::endl;
            }
            else
            {
                throw;
            }
        }
    }
}

int main()
{
    /*try
    {
        SendMsg("test message");
    }
    catch (const Exception& e)
    {
        std::cerr << "捕获到异常，错误编号: " << e.getid() << std::endl;
    }*/


    return 0;
}